package yxxy.c_019.Semaphore;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Semaphore;

public class SemaphoreExample3 {
    private static SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

    //同步关键类，构造方法传入的数字是多少，则同一个时刻,只运行多少个进程同时运行指定代码
    private Semaphore semaphore = new Semaphore(2);

    public void doSomething(){
        /**
         * 在 semaphore.acquire() 和 semaphore.release()之间的代码，同一时刻只允许指定个数的线程进入，
         * 因为semaphore的构造方法是1，则同一时刻只允许一个线程进入，其他线程只能等待。
         **/
        try {
            semaphore.acquire();
            System.out.println(Thread.currentThread().getName() + ":doSomething start-"+GetFormatTimeStr());
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName() + ":doSomething end-"+GetFormatTimeStr());
            semaphore.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static String GetFormatTimeStr(){
        return sf.format(new Date());
    }

    public static void main(String[] args) {
        SemaphoreExample3 semaphoreExample3 = new SemaphoreExample3();

        for (int i = 0; i < 10; i++) {
           /* MyThread t = new MyThread("thread" + (i + 1), semaphoreExample3);
            t.start();// 这里使用 t.run() 也可以运行，但是不是并发执行了*/

            new Thread(new Runnable() {
                @Override
                public void run() {
                    semaphoreExample3.doSomething();
                }
            },"thread"+(i+1)).start();
        }
    }
}



class MyThread extends Thread{

    private String name;
    private SemaphoreExample3 service;


    public MyThread(String name, SemaphoreExample3 service) {
        super();
        this.name = name;
        this.service = service;
    }

    @Override
    public void run() {
        this.service.doSomething();
    }
}
